home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / texinfo / info / infomap.c < prev    next >
C/C++ Source or Header  |  1994-01-28  |  9KB  |  270 lines

  1. /* infomap.c -- Keymaps for Info. */
  2.  
  3. /* This file is part of GNU Info, a program for reading online documentation
  4.    stored in Info format.
  5.  
  6.    Copyright (C) 1993 Free Software Foundation, Inc.
  7.  
  8.    This program is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 2, or (at your option)
  11.    any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22.    Written by Brian Fox (bfox@ai.mit.edu). */
  23.  
  24. #include "stdio.h"
  25. #include "ctype.h"
  26. #include "infomap.h"
  27. #include "funs.h"
  28.  
  29. /* Return a new keymap which has all the uppercase letters mapped to run
  30.    the function info_do_lowercase_version (). */
  31. Keymap
  32. keymap_make_keymap ()
  33. {
  34.   register int i;
  35.   Keymap keymap;
  36.  
  37.   keymap = (Keymap)xmalloc (256 * sizeof (KEYMAP_ENTRY));
  38.  
  39.   for (i = 0; i < 256; i++)
  40.     {
  41.       keymap[i].type = ISFUNC;
  42.       keymap[i].function = (VFunction *)NULL;
  43.     }
  44.  
  45.   for (i = 'A'; i < ('Z' + 1); i++)
  46.     {
  47.       keymap[i].type = ISFUNC;
  48.       keymap[i].function = info_do_lowercase_version;
  49.     }
  50.  
  51.   return (keymap);
  52. }
  53.  
  54. /* Return a new keymap which is a copy of MAP. */
  55. Keymap
  56. keymap_copy_keymap (map)
  57.      Keymap map;
  58. {
  59.   register int i;
  60.   Keymap keymap;
  61.  
  62.   keymap = keymap_make_keymap ();
  63.  
  64.   for (i = 0; i < 256; i++)
  65.     {
  66.       keymap[i].type = map[i].type;
  67.       keymap[i].function = map[i].function;
  68.     }
  69.   return (keymap);
  70. }
  71.  
  72. /* Free the keymap and it's descendents. */
  73. void
  74. keymap_discard_keymap (map)
  75.      Keymap (map);
  76. {
  77.   register int i;
  78.  
  79.   if (!map)
  80.     return;
  81.  
  82.   for (i = 0; i < 256; i++)
  83.     {
  84.       switch (map[i].type)
  85.     {
  86.     case ISFUNC:
  87.       break;
  88.  
  89.     case ISKMAP:
  90.       keymap_discard_keymap ((Keymap)map[i].function);
  91.       break;
  92.  
  93.     }
  94.     }
  95. }
  96.  
  97. /* Initialize the standard info keymaps. */
  98.  
  99. Keymap info_keymap = (Keymap)NULL;
  100. Keymap echo_area_keymap = (Keymap)NULL;
  101.  
  102. void
  103. initialize_info_keymaps ()
  104. {
  105.   register int i;
  106.   Keymap map;
  107.  
  108.   if (!info_keymap)
  109.     {
  110.       info_keymap = keymap_make_keymap ();
  111.       info_keymap[ESC].type = ISKMAP;
  112.       info_keymap[ESC].function = (VFunction *)keymap_make_keymap ();
  113.       info_keymap[Control ('x')].type = ISKMAP;
  114.       info_keymap[Control ('x')].function = (VFunction *)keymap_make_keymap ();
  115.       echo_area_keymap = keymap_make_keymap ();
  116.       echo_area_keymap[ESC].type = ISKMAP;
  117.       echo_area_keymap[ESC].function = (VFunction *)keymap_make_keymap ();
  118.       echo_area_keymap[Control ('x')].type = ISKMAP;
  119.       echo_area_keymap[Control ('x')].function =
  120.     (VFunction *)keymap_make_keymap ();
  121.     }
  122.  
  123.   /* Bind numeric arg functions for both echo area and info window maps. */
  124.   for (i = '0'; i < '9' + 1; i++)
  125.     {
  126.       ((Keymap) info_keymap[ESC].function)[i].function =
  127.     ((Keymap) echo_area_keymap[ESC].function)[i].function =
  128.       info_add_digit_to_numeric_arg;
  129.     }
  130.   ((Keymap) info_keymap[ESC].function)['-'].function =
  131.     ((Keymap) echo_area_keymap[ESC].function)['-'].function =
  132.       info_add_digit_to_numeric_arg;
  133.  
  134.   /* Bind the echo area routines. */
  135.   map = echo_area_keymap;
  136.  
  137.   /* Bind the echo area insert routines. */
  138.   for (i = 0; i < 160; i++)
  139.     if (isprint (i))
  140.       map[i].function = ea_insert;
  141.  
  142.   map[Control ('a')].function = ea_beg_of_line;
  143.   map[Control ('b')].function = ea_backward;
  144.   map[Control ('d')].function = ea_delete;
  145.   map[Control ('e')].function = ea_end_of_line;
  146.   map[Control ('f')].function = ea_forward;
  147.   map[Control ('g')].function = ea_abort;
  148.   map[Control ('h')].function = ea_rubout;
  149.   map[Control ('k')].function = ea_kill_line;
  150.   map[Control ('l')].function = info_redraw_display;
  151.   map[Control ('q')].function = ea_quoted_insert;
  152.   map[Control ('t')].function = ea_transpose_chars;
  153.   map[Control ('u')].function = info_universal_argument;
  154.   map[Control ('y')].function = ea_yank;
  155.  
  156.   map[LFD].function = ea_newline;
  157.   map[RET].function = ea_newline;
  158.   map[SPC].function = ea_complete;
  159.   map[TAB].function = ea_complete;
  160.   map['?'].function = ea_possible_completions;
  161.   map[DEL].function = ea_rubout;
  162.  
  163.   /* Bind the echo area ESC keymap. */
  164.   map = (Keymap)echo_area_keymap[ESC].function;
  165.  
  166.   map[Control ('g')].function = ea_abort;
  167.   map[Control ('v')].function = ea_scroll_completions_window;
  168.   map['b'].function = ea_backward_word;
  169.   map['d'].function = ea_kill_word;
  170.   map['f'].function = ea_forward_word;
  171. #if defined (NAMED_FUNCTIONS)
  172.   /* map['x'].function = info_execute_command; */
  173. #endif /* NAMED_FUNCTIONS */
  174.   map['y'].function = ea_yank_pop;
  175.   map['?'].function = ea_possible_completions;
  176.   map[TAB].function = ea_tab_insert;
  177.   map[DEL].function = ea_backward_kill_word;
  178.  
  179.   /* Bind the echo area Control-x keymap. */
  180.   map = (Keymap)echo_area_keymap[Control ('x')].function;
  181.  
  182.   map['o'].function = info_next_window;
  183.   map[DEL].function = ea_backward_kill_line;
  184.  
  185.   /* Bind commands for Info window keymaps. */
  186.   map = info_keymap;
  187.   map[TAB].function = info_move_to_next_xref;
  188.   map[LFD].function = info_select_reference_this_line;
  189.   map[RET].function = info_select_reference_this_line;
  190.   map[SPC].function = info_scroll_forward;
  191.   map[Control ('a')].function = info_beginning_of_line;
  192.   map[Control ('b')].function = info_backward_char;
  193.   map[Control ('e')].function = info_end_of_line;
  194.   map[Control ('f')].function = info_forward_char;
  195.   map[Control ('g')].function = info_abort_key;
  196.   map[Control ('h')].function = info_get_help_window;
  197.   map[Control ('l')].function = info_redraw_display;
  198.   map[Control ('n')].function = info_next_line;
  199.   map[Control ('p')].function = info_prev_line;
  200.   map[Control ('r')].function = isearch_backward;
  201.   map[Control ('s')].function = isearch_forward;
  202.   map[Control ('u')].function = info_universal_argument;
  203.   map[Control ('v')].function = info_scroll_forward;
  204.   map[','].function = info_next_index_match;
  205.  
  206.   for (i = '1'; i < '9' + 1; i++)
  207.     map[i].function = info_menu_digit;
  208.   map['0'].function = info_last_menu_item;
  209.  
  210.   map['<'].function = info_first_node;
  211.   map['>'].function = info_last_node;
  212.   map['?'].function = info_get_help_window;
  213.   map['['].function = info_global_prev_node;
  214.   map[']'].function = info_global_next_node;
  215.  
  216.   map['b'].function = info_beginning_of_node;
  217.   map['d'].function = info_dir_node;
  218.   map['e'].function = info_end_of_node;
  219.   map['f'].function = info_xref_item;
  220.   map['g'].function = info_goto_node;
  221.   map['h'].function = info_get_info_help_node;
  222.   map['i'].function = info_index_search;
  223.   map['l'].function = info_history_node;
  224.   map['m'].function = info_menu_item;
  225.   map['n'].function = info_next_node;
  226.   map['p'].function = info_prev_node;
  227.   map['q'].function = info_quit;
  228.   map['r'].function = info_xref_item;
  229.   map['s'].function = info_search;
  230.   map['t'].function = info_top_node;
  231.   map['u'].function = info_up_node;
  232.   map[DEL].function = info_scroll_backward;
  233.  
  234.   /* Bind members in the ESC map for Info windows. */
  235.   map = (Keymap)info_keymap[ESC].function;
  236.   map[Control ('f')].function = info_show_footnotes;
  237.   map[Control ('g')].function = info_abort_key;
  238.   map[TAB].function = info_move_to_prev_xref;
  239.   map[Control ('v')].function = info_scroll_other_window;
  240.   map['<'].function = info_beginning_of_node;
  241.   map['>'].function = info_end_of_node;
  242.   map['b'].function = info_backward_word;
  243.   map['f'].function = info_forward_word;
  244.   map['r'].function = info_move_to_window_line;
  245.   map['v'].function = info_scroll_backward;
  246. #if defined (NAMED_FUNCTIONS)
  247.   map['x'].function = info_execute_command;
  248. #endif /* NAMED_FUNCTIONS */
  249.  
  250.   /* Bind members in the Control-X map for Info windows. */
  251.   map = (Keymap)info_keymap[Control ('x')].function;
  252.  
  253.   map[Control ('b')].function = list_visited_nodes;
  254.   map[Control ('c')].function = info_quit;
  255.   map[Control ('f')].function = info_view_file;
  256.   map[Control ('g')].function = info_abort_key;
  257.   map[Control ('v')].function = info_view_file;
  258.   map['0'].function = info_delete_window;
  259.   map['1'].function = info_keep_one_window;
  260.   map['2'].function = info_split_window;
  261.   map['^'].function = info_grow_window;
  262.   map['b'].function = select_visited_node;
  263.   map['k'].function = info_kill_node;
  264.   map['o'].function = info_next_window;
  265.   map['t'].function = info_tile_windows;
  266.   map['w'].function = info_toggle_wrap;
  267. }
  268.  
  269.   
  270.